home *** CD-ROM | disk | FTP | other *** search
- BASICコンパイラによって作られた実行プログラムにパッチを当てて、UXで動
- くようにするプログラム:UXPATCH.EXE Ver.1.00 By Jouji
-
- ◆プログラム概要
- このプログラムは、BASICコンパイラV1.1L21でコンパイルした実行プ
- ログラム*.EXPにパッチを当てて、UXで動くようにするものです。
- 私はFM-TOWNS UX20のユーザーですが、現在UXのユーザーは結構多
- いのではないでしょうか。UXのユーザーの方はご存知でしょうが、UXではBAS
- ICコンパイラV1.1L21でコンパイルした*.EXPのプログラムが動きませ
- ん。フリコレ3~5にはこのようなプログラムが結構あって、起動しようとしたら画
- 面が真っ暗になってそのままハングアップという経験をお持ちの方もたくさんいらっ
- しゃることと思います。L21Dで再コンパイルしていただければ動くようになるの
- ですが、L21D版が出ないものも結構あるようです。
- 自分のマシンで動かないプログラムがあるということは気になるものです。Oh!
- FM-TOWNSによるとプログラムの起動時に数値演算コプロセッサ387の識別
- に失敗してハングアップしているということです。それならプログラムにパッチを当
- てて、387の識別の所を強制的に387無し(UXでは387は付けられないので)
- としてしまえばよいのではないかと考えた訳です。しかし、*.EXPプログラムの
- 解析をしようにも386対応のデバッガが無い!仕方がないのでSYMDEB.EX
- Eを使ってみました。そしたら、もう大変。オペランドのサイズが2バイトと4バイ
- トというように違うので、これを解析するのには気の遠くなるような手間がかかりそ
- うです。そこで一念発起、386用逆アセンブラまで作ってしまいました。それを使
- って解析した結果によってこのパッチ当てプログラムができたわけです。
-
-
- ◆起動方法
- プログラムはLSIC-86試食版によってコンパイルされており、MS-DOS
- 汎用です。T-OSのコマンドモードあるいはMS-DOSのコマンドラインから次
- のようにして起動してください。
-
- uxpatch File_name
-
- 対象のファイル名はLSIC-86のワイルドカード展開機能に合致するワイルド
- カード文字が使用できます。ワイルドカードにマッチする全てのファイルに対して順
- 番に処理を行います。実行例を示します。
-
- I:\USR>uxpatch *.exp
- D_RIDER1.EXP: 書き換えました。
- D_RIDER2.EXP: 書き換えました。
-
- なお、蛇足とは思いますがCD-ROMのファイルは書き換えられませんから、ハ
- ードディスク等にコピーしてから書き換えてください。また、ファイルにリードオン
- リー属性が付与されている場合は、フリコレ5のATTRIB.EXP等により属性
- を解除するか、COPYコマンドによりコピーして属性を解除してから書き換えてく
- ださい。リードオンリー属性が付いている場合、および、既に書き換えているファイ
- ルの場合は次のように表示します。
-
- I:\USR>uxpatch *.exp
- BOM.EXP: 読み書きモードでオープンできません。
- D_RIDER1.EXP: データが違います。[90]
- D_RIDER2.EXP: データが違います。[90]
-
- 実行プログラムがBASICコンパイラV1.1L21でコンパイルされたもので
- あるかどうかは、フリコレ5のTUGI.EXP等によってオフセット0x0200
- 以降の16進ダンプデータを見てみればすぐに分かります。確認してから書き換えた
- 方が安全です。(他のプログラムを書き換えることは、確率的にまずありえないと思
- いますが。) また、フリコレ5のLZEXP.EXPにより圧縮されているファイ
- ルもダンプしてみるとバージョンは分かります。これはLZEXP.EXPによって
- 元に戻してから書き換えてください。(フリコレ4のPACKEXP.EXPで圧縮
- されたものは、元に戻せないのでしょうか?)
-
-
- ◆動作
- BASICコンパイラV1.1L21でコンパイルされた実行プログラムの数値演
- 算コプロセッサ387識別ルーチンは次のようになっています。
-
- _00000000: xorl %edx,%edx #33 D2
- _00000002: movl %cr0,%eax #0F 20 C0
- _00000005: opsize #66
- _00000006: testw $0x0004,%ax #A9 04 00
- _00000009: jne _00000012 #75 07
- _0000000b: opsize #66
- _0000000c: testw $0x0010,%ax #A9 10 00
- _0000000f: je _00000012 #74 01
- _00000011: decl %edx #4A
- _00000012: movl %edx,0x0002254c #89 15 4C 25 02 00
- _00000018: ret #C3
-
- このプログラムUXPATCH.EXEは、このデータ列を探して _00000011: のデ
- ータを 0x90 (nop) に書き換えます。対象ファイルを読み書きモードでオープンして
- 直接書き換えていますから注意してください。必要ならばバックアップを取っておい
- てください。書き換えデータは1バイトだけであり、また、データ列が見つからない
- 場合は書き換えません。
-
-
- ◆謎のCR0レジスタ
- UXPATCH.EXEによってほとんどのプログラムが私のUXで動くようにな
- り、とても満足でした。しかし、通勤電車の中でふと思い付いたのです。CR0レジ
- スタの内容をちゃんと設定すればこんなパッチなど不要ではないか、そして、CD-
- ROMから普通に起動できるようになるのではないかと。そもそも、上の387識別
- ルーチンで調べているCR0レジスタのbit(31)…bit(0)の中のbit
- (4)は、386DXではリセット時に387の有無によって自動的にセットされる
- はずです。それが386SXでは、なぜか正常な値になっていないのです。上の識別
- ルーチンでは、CR0のbit(4)==0またはbit(2)==1ならば387
- 無しと判定しています。CR0をこのように設定できればパッチ当ては不要となるわ
- けです。
- そこで、CR0レジスタの内容を表示するプログラムと内容を変更するプログラム
- を作って調査してみました。プロテクトモードで調査すると、確かに387もないの
- にbit(4)==1となっており、bit(2)==0となっていて、上の識別ル
- ーチンでは387有りと判定されてしまいます。そこで、これらのビットを反転させ
- てみようとしました。ところがbit(4)は変更しようとしても変更できません(
- 回路が接続されていない?)。bit(2)は一応変更できるのですが、プログラム
- を終了するとまた元に戻ってしまいます。どうも、RUN386.EXEが再設定し
- てしまうようです。
- つぎに、リアルモードでも同じようなプログラムを作って調査しました。リアルモ
- ードでも同様にbit(4)は変更できず、bit(2)は変更できます。今度はR
- UN386.EXEが関与していないので値も保存されています。しかし、bit
- (2)==1の状態でRUN386.EXEから*.EXPプログラムを起動すると
- 不法な割り込み2が発生してハングアップしてしまいました。
- たぶん、386SXではコストダウンのために387の自動識別回路が削除されて
- いるのではないかと思います。それにともなってCR0のbit(4)も1に固定さ
- れてしまったのではないでしょうか。bit(2)はRUN386.EXEが再設定
- してしまうようですし、やはりパッチ当てしか無いようですね。(RUN386.E
- XEにパッチ当てするという手もありますが。)
-
-
- ◆著作権
- Cのソースコードについては完全にフリーとします。改良、改造も可です。実行プ
- ログラムについてはLSIC-86試食版の配布条件に従ってください。(手数料以
- 上の金銭の授受は禁じられている。)
-
-
- ◆私が参考にした文献
- 南宗宏「32ビットマイクロプロセッサ入門」CQ出版社
-